////////////////////////////////////////////////////////////////////////////////

#ifndef _SERVER_NETWORK_H_
#define _SERVER_NETWORK_H_

////////////////////////////////////////////////////////////////////////////////

#include <queue>

////////////////////////////////////////////////////////////////////////////////

#include "network_packets.h"
#include "server_session.h"
#include "thread.h"

////////////////////////////////////////////////////////////////////////////////


/** Game server network manager
*
*  @author   Roman Pasechnik
*  @since    Jun 11th, 2009
*  @updated  Jun 11th, 2009
*/
class ServerNetwork
{
////////////////////////////////////////////////////////////////////////////////

public:

////////////////////////////////////////////////////////////////////////////////


    /** Constructor */
    ServerNetwork( ClientPackets& _recvQueue,
                   ServerPackets& _sendQueue,
                   Mutex& _sendQueueMutex,
                   Mutex& _recvQueueMutex,
                   const std::string& _sendPort,
                   const std::string& _recvPort );


    /** Destructor */
    virtual ~ServerNetwork();


    /** Start Network */
    void Start();


////////////////////////////////////////////////////////////////////////////////

private:

////////////////////////////////////////////////////////////////////////////////


    /** Start thread for networking */
    void StartThread();


////////////////////////////////////////////////////////////////////////////////


    /** Thread for networking */
    ClientPackets& m_RecvQueue;


    /** Thread for networking */
    ServerPackets& m_SendQueue;


    /** Thread for networking */
    Mutex& m_SendQueueMutex;


    /** Thread for networking */
    Mutex& m_RecvQueueMutex;


    /** Thread in which network is working */
    Thread* m_StartThread;


    /** Send port */
    const std::string m_SendPort;


    /** Recv port */
    const std::string m_RecvPort;


    typedef std::list<ServerSession*> ServerSessions;
    ServerSessions m_Sessions;


////////////////////////////////////////////////////////////////////////////////
};


////////////////////////////////////////////////////////////////////////////////

#endif

////////////////////////////////////////////////////////////////////////////////

